﻿using System;

namespace Lesson7_静态成员
{
    #region 一 静态成员基本概念
    //静态关键字 static
    //用static修饰的成员变量、方法、属性等 称为静态成员
    //静态成员的特点是：可以不实例化对象 直接用类名点出使用
    #endregion

    #region 二 自定义静态成员
    class Test
    {
        //静态成员变量
        public static float PI = 3.1415926f;
        //成员变量
        public int testInt = 10086;
        //常量
        public const float testFloat = 114.514f;

        //静态成员方法
        static public double CalCircle(int r)
        {
            #region 五 静态函数中不能使用非静态成员
            //非静态成员必须实例化后才能使用
            //而静态函数可以不进行实例化 直接使用

            //注：非静态函数中可以使用静态成员
            #endregion
            return PI * r * r;
        }
        //成员方法
        public void TestFun()
        {
            Console.WriteLine("123456");
        }
    }
    #endregion

    #region ★四 为什么可以直接使用
    //注意：
    // 程序中不能无中生有 我们使用的对象、变量、函数都是要在内存中分配空间的
    // 之所以要实例化对象 目的就是分配内存空间

    //静态成员的特点：
    //程序开始运行时 会为静态成员分配内存空间 因此可以直接使用
    // ★ 静态成员和程序同生共死
    //只要使用了它 直到程序结束时内存空间才会被释放
    //静态成员的内存空间是唯一的
    // ★ 因此静态成员具有全局性
    //在任何位置使用了静态变量 使用的都是固定内存空间里的内容

    //静态成员所使用的内存空间不会触发GC
    //因此不能申明过多静态成员 这样会导致内存动态空间过少 程序卡顿甚至崩溃
    #endregion

    #region 六 静态成员的作用
    //静态变量：
    // 1.常用唯一变量的申明
    // 2.方便他人获取的对象申明
    //静态方法：
    // 常用的唯一的方法申明 如固定规则的数学计算方法
    #endregion

    #region 七 常量与静态变量
    //const（常量）可以理解成特殊的static（静态）
    //相同点
    //都可以通过类名点出使用
    //不同点
    //1.const必须初始化，不能修改  static没有这个规则
    //2.const只能修饰变量
    //3.const必须写在访问修饰符后面 static无限制
    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            #region 三 静态成员的使用
            //无需实例化对象 直接用类名点出使用即可
            //实例化调用会报错
            Console.WriteLine(Test.PI);
            Test.CalCircle(5);
            Console.WriteLine(Test.testFloat);
            Test test = new Test();
            #endregion
        }
    }
}